package com.ce.sys.msg.view;

import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import com.ce.framework.datamaintain.logic.ISQLMapper;
import com.ce.sys.login.model.User;
import com.ce.util.DbUtil;
import com.ce.util.OrgUtil;

/**
 * 嫦娥软件有限公司 版权所有 2013
 * 创建人： andy
 * 创建时间： 2011-3-22 下午02:51:59
 * 功能描述：弹出信息获取类
 * ==================================
 * 修改历史
 * 修改人        修改时间      修改位置（函数名）
 *
 * ==================================
 */
public class MsgDefine implements Serializable {
	private static final long serialVersionUID = 1L;
	protected Logger log = Logger.getLogger(this.getClass());

	public final static String SAVE_ID_IN_SESSION = "msgSaveIdInSession";

	private int interval = 5;
	private List<SysMsgDefineView> msgDefList;
	private HashMap<String,String> params = new HashMap<String,String>();
	
	
	private MsgDefine(User user) {
		this.initConfig(user);
	}


	/**
	 * 开发人： andy
	 * 开发时间： 2013-3-22 下午02:55:43
	 * 功能描述：信息初始化
	 * 方法的参数和返回值
	 * @param request
	 * @return
	 * MsgDefine 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static MsgDefine getInstance(HttpServletRequest request){
		User user = User.getUser(request);
		if(user==null)
			return null;
		MsgDefine md = (MsgDefine) request.getSession().getAttribute(SAVE_ID_IN_SESSION);
		if(md==null){
			md = new MsgDefine(user);
			request.getSession().setAttribute(SAVE_ID_IN_SESSION, md);
		}
		return md;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-3-22 下午02:57:52
	 * 功能描述：初始化用户的弹出信息配置项
	 * 方法的参数和返回值
	 * @param user
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	private void initConfig(User user){
		if(user==null)
			return;
		String curUserId = user.getVcId();
		String curUserName = user.getVcName();
		String curDepId = User.getUserOrgId();
		String curDepName = OrgUtil.getOrgName(User.getUserOrgId());
		String curOrgId = OrgUtil.getOrgManProId(User.getUserOrgId());
		String curOrgName = user.getOrgName();
		String curOrgType = OrgUtil.getOrgManProType(User.getUserOrgId());
		params.put("curUserId", curUserId);
		params.put("curUserName", curUserName);
		params.put("curDepId", curDepId);
		params.put("curDepName", curDepName);
		params.put("curOrgId", curOrgId);
		params.put("curOrgName", curOrgName);
		params.put("curOrgType", curOrgType);
		msgDefList = new ArrayList<SysMsgDefineView>();
		StringBuffer sqlBuff = new StringBuffer("select t2.N_INTERVAL from ")
		.append("SYS_T_MSG$PERSONAL t2 where t2.vc_user$id=?");
        //获取信息弹出时间间隔
		this.interval = DbUtil.getFirstIntSqlQuery(sqlBuff.toString(),new Object[]{curUserId});
		//获取当前登录人所有的配置的提示信息项目
//		sqlBuff = new StringBuffer("select t3.*,m.vc_name as menuName from SYS_T_MSG$DEFINE t3 ,SYS_T_MENU m " +
//				"where  t3.vc_action$id = m.vc_id(+) and t3.vc_del$flag = 0 and t3.vc_id in (select t2.vc_msg$id " +
//				"from sys_t_msg$personal$item t2 where t2.vc_main$id = " +
//				"(select t1.vc_id from SYS_T_MSG$PERSONAL t1 where t1.vc_user$id = '"+curUserId+"'))");
		sqlBuff = new StringBuffer("select t.*, p.vc_id as chooseId  from SYS_T_MSG$DEFINE t, sys_t_msg$personal$item p" +
				" where t.vc_id = p.vc_msg$id(+) and p.vc_user$id=? and t.vc_del$flag = 0" +
				"    and ( t.vc_action$id in" +
				"       (select p.vc_menu$id" +
				"          from SYS_T_ROLE$PERMISS p" +
				"         where p.vc_role$id in" +
				"               (select r.vc_role$id" +
				"                  from sys_t_account$role r" +
				"                where r.vc_user$id=?) or p.vc_role$id='common') or t.n_flag=1) and p.vc_id is not null");
		
		List<?> messages = DbUtil.executeSqlQuery(sqlBuff.toString(), new ISQLMapper(){
			public Object fromSQLQuery(ResultSet rs, int num) {
				// TODO Auto-generated method stub
				SysMsgDefineView view = new SysMsgDefineView();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcName(rs.getString("VC_NAME"));
					view.setVcSql(rs.getString("VC_SQL"));
					view.setVcTitle(rs.getString("VC_TITLE"));
					view.setVcUrl(rs.getString("VC_URL"));
					view.setVcRescId(rs.getString("VC_RESC$ID"));
					view.setNflag(rs.getInt("N_FLAG"));
					view.setVcDelFlag(rs.getString("VC_DEL$FLAG"));
					view.setVcActionId(rs.getString("VC_ACTION$ID"));	
					//view.setMenuName(rs.getString("menuName"));
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		},new Object[]{curUserId,curUserId});
		Iterator<?> it = messages.iterator();
		while(it.hasNext()){
			SysMsgDefineView view = (SysMsgDefineView)it.next();
			msgDefList.add(view);
		}
	}
	
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-3-22 下午02:59:01
	 * 功能描述：获取当前用户的配置的弹出信息
	 * 方法的参数和返回值
	 * @return
	 * @throws SQLException
	 * List 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public  List<SysMsgDefineView> getMsgList(){
		List<SysMsgDefineView> msgList = new ArrayList<SysMsgDefineView>();
		int cnt = 0;
		String sql = null;
		SysMsgDefineView msgDef = null;
		for(int i=0;i<msgDefList.size();i++){
			msgDef = (SysMsgDefineView)msgDefList.get(i);
			sql = msgDef.getVcSql();
			if(sql==null)
				continue;
			Pattern pat = Pattern.compile("\\$\\{([^\\}]+)\\}");
			Matcher mat = pat.matcher(sql);
			List<Object> paraml = new ArrayList<Object>();
			int index = 0;
			while(mat.find()){
				String pa = mat.group(1);
				paraml.add(index++,params.get(pa));
			}
			Object [] ps = new Object[index];
			for(int j=0;j<index;j++){
				ps[j] = paraml.get(j);
			}
			sql = sql.replaceAll("'?\\$\\{([^\\}]+)\\}'?", "?");
			try{
				cnt = DbUtil.getFirstIntSqlQuery(sql,ps);	
			}catch(Exception e){
			   e.printStackTrace();  //此处可能产生sql语句不正确的现象，忽略错误；
			   log.error("sql语句可能存在错误，请检查："+sql);
			   continue;
			}
			if(cnt>0){
				msgDef.setVcTitle(msgDef.getVcTitle().replaceAll("\\$1",String.valueOf(cnt)));
				msgList.add(msgDef);
			}
		}
		return msgList;
	}
	
	public boolean isShowMsg(){
		if(msgDefList!=null&&msgDefList.size()>0) 
			return true;
		else
			return false;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-3-22 下午03:04:02
	 * 功能描述：获取信息弹出时间间隔
	 * 方法的参数和返回值
	 * @return
	 * int 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public int getInterval(){
		if(this.interval<5)
			return 5;
		return this.interval;
	}

}

